#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#include "LED.h"
#include "Key.h"
#include "OLED.h"

int main(void)
{
	// 初始化
	OLED_Init();
	Key_Init();

	OLED_ShowString(1, 1, "IWDG TEST");
	
	// 使用RCC查询复位标志函数, 用于区分是普通上电复位还是窗口看门狗触发的复位
	if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)
	{
		OLED_ShowString(2, 1, "WWDG RST");
		Delay_ms(500);
		OLED_ShowString(2, 1, "        ");
		Delay_ms(500);
		
		RCC_ClearFlag();
	}
	else
	{
		OLED_ShowString(3, 1, "OTHER RST");
		Delay_ms(500);
		OLED_ShowString(3, 1, "         ");
		Delay_ms(500);
	}
	
	// 初始化
	// 1. 开启APB1总线上 WWDG 外设的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
	
	// 先明确想要的超时时间是多少: 50ms = 1 / 36MHz X 4096 X 预分频: 8  X (T[5:0]: 54 + 1)
	// 再次明确窗口时间是多少    : 
	
	// 2. 配置预分频
	WWDG_SetPrescaler(WWDG_Prescaler_8);
	
	// 3. 写入窗口值:  30ms = 1 / 36MHz X 4096 X 8 X (54 - W[5:0] : 21)
	WWDG_SetWindowValue(0x40 | 21);
	
	// 4. 使能中断
	WWDG_Enable(0x40 | 54);	
	
	while(1)
	{
		// 按下阻塞循环, 防止喂狗
		Key_GetNum();
				
		OLED_ShowString(4, 1, "FEED");
		Delay_ms(20);
		OLED_ShowString(4, 1, "    ");
		Delay_ms(20);
		
		// 5. 写入计数器进行喂狗
		WWDG_SetCounter(0x40 | 54);
	}
}